package Juc.基础;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Ticket {
    static Lock lock=new ReentrantLock(false);//可重入锁 //默认false枪锁非公平锁
    private static int number = 30 ; //volatile  在不加锁的时候可保证唯一性

    public static  void sale()//高内聚 资源类自带的方法     synchronized重锁   lock轻锁   //函数式接口可用
    {
        lock.lock();//加锁
        try{
            if(number>0){
                try {TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) {e.printStackTrace();}
                System.out.println(Thread.currentThread().getName()+"\t卖出第："+(number--)+"张票"+"还剩下："+number);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();//放锁
        }
    }

//    public void sale() //高内聚 资源类自带的方法     synchronized重锁   lock轻锁   //函数式接口可用
//    {
//        if(number>0){
//            if(number%2==0){
//                try {TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) {e.printStackTrace();}
//            }
//            System.out.println(Thread.currentThread().getName()+"\t卖出第"+(number--)+"张票"+"还剩下："+number);
//        }
//    }

}//资源类      =实例+方法

public class 锁卖票 {

    public static void main(String[] args) {
        lambda();
    }

    //一种 //在高内聚低耦合的前提下  线程  操作  资源类
    // 资源类自带的方法     synchronized重锁   lock轻锁   //函数式接口可用
    private static void lambda() {

        Ticket ticket=new Ticket();
        new Thread(() ->{for(int i=0;i<40;i++)ticket.sale();},"A").start();
        new Thread(() ->{for(int i=0;i<40;i++)ticket.sale();},"B").start();
        new Thread(() ->{for(int i=0;i<40;i++)ticket.sale();},"C").start();
        //升级版
        Thread.State aNew = Thread.State.NEW;//枚举  6种线程状态

    }
}